﻿using System;
using System.Collections.Generic;
using NUnit.Framework;
using Studio7i.CapaDominio;
using Studio7i.CapaPersistencia;
using Studio7i.CapaPersistencia.DAO;

namespace Studio7i.CapaPruebas
{
    [TestFixture]
    public class Test_ClienteDAO
    {
        IClienteDAO clienteDAO = null;
        IReservaDAO reservaDAO = null;
        IArmadoReservaDAO armadoreservaDAO = null;


        [TestFixtureSetUp]
        public void PrepararPruebas()
        {

            armadoreservaDAO = new ArmadoDeReservaDAO();
            foreach (ArmadoDeReserva i in armadoreservaDAO.ListarTodos()) armadoreservaDAO.Eliminar(i);

            reservaDAO = new ReservaDAO();
            foreach (Reserva i in reservaDAO.ListarTodos()) reservaDAO.Eliminar(i);

            // 1. Definimos la implementación del DAO a probar (ADO / NH / EF)
            clienteDAO = new ClienteDAO();
            // 2. Eliminamos todos los clientes en BD antes de las pruebas
            foreach (Cliente cliente in clienteDAO.ListarTodos())
                clienteDAO.Eliminar(cliente);
            // 3. Creamos 2 cliente para tenerlos disponibles en las pruebas
            clienteDAO.Crear(new Cliente() { CoCliente = 43811752, NoCliente = "Jorge Luis Camarena Cueva", TxMail = "jlccsc19@hotmail.com", FeNacimiento = "05/10/1986", TxtClave = "1234" });
            clienteDAO.Crear(new Cliente() { CoCliente = 65455678, NoCliente = "Luis Alonso Camarena Juli", TxMail = "luismaximo2@gmail.com", FeNacimiento = "09/11/1987", TxtClave = "1234" });
        }

        [Test]
        public void Test1_Crear()
        {
            // 1. Clase a probar: ClienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Cliente clienteACrear = new Cliente();
            clienteACrear.CoCliente = 56455678;
            clienteACrear.NoCliente = "Luis Alberto Rodriguez Farfan";
            clienteACrear.TxMail = "lfarfanji@hotmail.com";
            clienteACrear.FeNacimiento = "12/09/1982";
            clienteACrear.TxtClave = "4321";
            // 3. Declaramos la entidad que contendrá el resultado
            Cliente clienteCreado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteCreado = clienteDAO.Crear(clienteACrear);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteCreado);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(clienteCreado.NoCliente, clienteACrear.NoCliente);
            /*
            Assert.Catch<Exception>(delegate
            {
                clienteCreado = clienteDAO.Crear(clienteACrear);
            });*/

        }
        [Test]
        public void Test2_Obtener()
        {
            // 1. Clase a probar: clienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Definimos los datos para la prueba
            int codigo = 65455678;
            // 3. Declaramos la entidad que contendrá el resultado
            Cliente clienteObtenido = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteObtenido = clienteDAO.Obtener(codigo);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteDAO);
            Assert.AreEqual(clienteObtenido.CoCliente, codigo);
            Assert.IsNotNullOrEmpty(clienteObtenido.NoCliente);
            Assert.IsNotNullOrEmpty(clienteObtenido.TxMail);
        }
        [Test]
        public void Test3_Modificar()
        {
            // 1. Clase a probar: clienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Declaramos e instanciamos la entidad de dominio
            Cliente clienteAModificar = clienteDAO.Obtener(43811752);
            clienteAModificar.NoCliente = "Estevan Climaldo Vasque Vasquez";
            clienteAModificar.TxMail = "estevasquez@hotmail.com";
            // 3. Declaramos la entidad que contendrá el resultado
            Cliente clienteModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteModificado = clienteDAO.Modificar(clienteAModificar);
            }, "cliente modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clienteModificado);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            //Assert.AreEqual(clienteModificado.NoCliente, clienteAModificar.NoCliente);
            // Probamos que el email registrado es igual a la solicitada con la entidad
            //Assert.AreEqual(clienteModificado.TxMail, clienteAModificar.TxMail);
        }
        [Test]
        public void Test4_Eliminar()
        {
            // 1. Clase a probar: clienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Definimos la entidad que contendrá el resultado
            Cliente clienteExistente = clienteDAO.Obtener(65455678);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clienteDAO.Eliminar(clienteExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(clienteDAO.Obtener(65455678));
        }
        [Test]
        public void Test5_ListarTodos()
        {
            // 1. Clase a probar: clienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Declaramos la entidad que contendrá el resultado
            ICollection<Cliente> clientesEncontrados = null;
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clientesEncontrados = clienteDAO.ListarTodos();
            }, "clientes encontrados");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clientesEncontrados);
            // Probamos que la cantidad de clientes encontrados sea 2
            Assert.AreEqual(clientesEncontrados.Count, 2);
            // Probamos que cada cliente contenga la cadena de búsqueda en su nombre
            foreach (Cliente clienteEncontrado in clientesEncontrados)
            {
                Assert.IsNotNull(clienteEncontrado);
                Assert.IsInstanceOf(typeof(Cliente), clienteEncontrado);
            }
        }
        [Test]
        public void Test6_ListarXNombre()
        {
            // 1. Clase a probar: clienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Definimos los datos para la prueba
            string busqueda = "luis";
            // 3. Declaramos la entidad que contendrá el resultado
            ICollection<Cliente> clientesEncontrados = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clientesEncontrados = clienteDAO.ListarXNombre(busqueda);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clientesEncontrados);
            // Probamos que la cantidad de clientes encontrados sea 1
            Assert.GreaterOrEqual(clientesEncontrados.Count, 1);
            // Probamos que cada cliente contenga la cadena de búsqueda en su nombre
            /*foreach (Cliente clienteEncontrado in clientesEncontrados)
            {
                Assert.IsTrue(clienteEncontrado.NoCliente.Contains(busqueda));
            }*/
        }

        [Test]
        public void Test7_ListarXBusqueda()
        {
            // 1. Clase a probar: ClienteDAO
            Assert.IsNotNull(clienteDAO);
            // 2. Definimos los datos para la prueba
            string nombres = "uis"; // Luis *
            // 3. Declaramos la entidad que contendrá el resultado
            ICollection<Cliente> clientesEncontrados = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                clientesEncontrados = clienteDAO.ListarXBusquedaCliente(null, nombres, null,null, null);
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(clientesEncontrados);
            // Probamos que la cantidad de clientes encontrados sea 1
            Assert.GreaterOrEqual(clientesEncontrados.Count, 1);
            // Probamos que cada local contenga la cadena de búsqueda en su nombre
            foreach (Cliente clienteEncontrado in clientesEncontrados)
            {
                Assert.IsTrue(clienteEncontrado.NoCliente.Contains(nombres));
            }
        }
    }
}